package cn.itsource.basic.service.impl;

import cn.itsource.basic.service.ICodeService;
import cn.itsource.user.contants.UserContants;
import cn.itsource.user.domain.User;
import cn.itsource.user.mapper.UserMapper;
import cn.itsource.utils.SendMsgUtis;
import cn.itsource.utils.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class CodeServiceImpl implements ICodeService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    //给手机号发送验证码
    /*
        1.产生一个验证码 6位纯数字验证码

        2.验证码存储一下【redis】
           key              value
        15008495702         952789

        3.通过运营商把验证码发送给用户的手机号

        1.验证手机是否注册
     */
    @Override
    public void sendCode(Map<String, String> map) {
        //产生一个6位的验证码
        String code = StrUtils.getRandomString(6);
        //获取用户的手机号
        String phone = map.get("phone");
        if (UserContants.REGISTER_CODE.equals(map.get("codeType"))){
            // 1.验证手机是否注册
            User user = userMapper.loadByPhone(phone);
            if (user!=null){
                throw new RuntimeException("该手机号已经注册，请直接登录");
            }
        }

        //2.60s以内不能重复发送验证码
        // 获取验证码 判断两次的时间间隔是否小于1分钟
        String codeAndTime = (String)redisTemplate.opsForValue().get(map.get("codeType")+":"+phone);
        if (codeAndTime!=null){//redis里面有存储验证码
            //获取存储验证码的时间
            Long time=Long.valueOf(codeAndTime.split(":")[1]);
            if (System.currentTimeMillis()-time<60*1000){
                throw new RuntimeException("操作过于频繁");
            }
            //如果 大于一分钟，并且redis里面有存储的验证码，在过了60s倒计时 用户没有收到验证码，点击重发
            //收到的验证码两次是一致
            code=codeAndTime.split(":")[0];
        }
        /*
            key：redis存储的key
            value: redis里面存储的值
            l:过期时间
            unit: 时间单位

                key                   value
         v1   13800113801          952718
         v2   13800113801          952718:1629339647  [验证码:时间戳]
         */
        //放到redis里面
        redisTemplate.opsForValue().set(map.get("codeType")+":"+phone,code+":"+ System.currentTimeMillis(),5, TimeUnit.MINUTES);

        System.out.println("本次的验证码为："+code);
        //发送验证码
       // SendMsgUtis.send(phone,"你的验证码为："+code+",请在5分钟内使用");
    }
}
